package persistencia;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import modelo.*;

public class AdmPersistenciaClientes {
	private static AdmPersistenciaClientes pool;
		
	private AdmPersistenciaClientes()
	{
	}
	
	public static AdmPersistenciaClientes getInstancia()
	{
		if (pool== null)
			pool = new AdmPersistenciaClientes();
		return pool;
	}
	
	public Cliente buscarCliente(String dni){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		Cliente cli=null;

		try {
			String senten = "select * from zzpracPrevioCliyTar.dbo.clientes where dni like ?";
			PreparedStatement ps = con.prepareStatement(senten);
			ps.setString(1, dni);
			ResultSet res = ps.executeQuery();
			while (res.next()){
				cli = new Cliente();
				cli.setDni(res.getString(1));
				cli.setNombre(res.getString(2));
			}
			/*CREO UN RESULTSET EN BASE A TODAS LAS TARJETAS DE UN CLIENTE, CREO UN VECTOR DE TARJETAS
			  LE AGREGO TODAS LAS TARJETAS DEL CLIENTE QUE ENCONTRE Y LUEGO SE LAS SETEO AL CLIENTE ESE.*/
			if(cli!=null){
				ResultSet tarjetas = this.obtenerTarjetasCliente(cli);
				Vector<Tarjeta> vector_tarjetas = new Vector<Tarjeta>();
				while(tarjetas.next()){
					Tarjeta tarjeta = new Tarjeta();
					tarjeta.setNumero(tarjetas.getInt(1));
					tarjeta.setLimite(tarjetas.getInt(2));
					vector_tarjetas.add(tarjeta);
				}
				cli.setTarjetas(vector_tarjetas);
			}
			PoolConnection.getPoolConnection().releaseConnection(con);
			return cli;
		} 
		catch (SQLException e) {
			System.out.println("Error al realizar select cliente");
			PoolConnection.getPoolConnection().releaseConnection(con);
			
		}
		return cli;
	}
	
	//METODO QUE SIRVE PARA DEVOLVERME EL QUERY DE TODAS LAS TARJETAS DE UN CLIENTE, POR CADA FILA DEL QUERY
	//GUARDADO EN EL RESULTSET RS VOY A CREAR UNA TARJETA EN EL METODO BUSCAR CLIENTE
	private ResultSet obtenerTarjetasCliente(Cliente cli){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		try {
			String senten = "select ta.numero,ta.limite from zzpracPrevioCliyTar.dbo.tarxcli t inner join zzpracPrevioCliyTar.dbo.clientes c on t.dni = c.dni inner join zzpracPrevioCliyTar.dbo.tarjetas ta on ta.numero = t.numero where c.dni like ?";
			PreparedStatement ps = con.prepareStatement(senten);
			ps.setString(1, cli.getDni());
			ResultSet rs = ps.executeQuery();
			PoolConnection.getPoolConnection().releaseConnection(con);
			return rs;	

		} 
		catch (Exception e) {
			System.out.println("Error en sumar limites");
			PoolConnection.getPoolConnection().releaseConnection(con);
			return null;
		}
	}

	public Tarjeta buscarTarjeta(int numero){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		Tarjeta tar=null;
		try {
			String senten = "select * from zzpracPrevioCliyTar.dbo.tarjeta where numero = ?";
			PreparedStatement ps = con.prepareStatement(senten);
			ps.setInt(1, numero);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				tar = new Tarjeta();
				tar.setNumero(rs.getInt(1));
				tar.setLimite(rs.getInt(2));
			}
			PoolConnection.getPoolConnection().releaseConnection(con);
			return tar;
		} catch (SQLException e) {
			System.out.println("Error al realizar select tarjeta");
			PoolConnection.getPoolConnection().releaseConnection(con);
		}
		return tar;
	}

	public void insertCliente(String dni, String nombre) {
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		try {
			String senten = "insert into zzpracPrevioCliyTar.dbo.clientes values (?,?)";
			PreparedStatement ps = con.prepareStatement(senten);
			ps.setString(1, dni);
			ps.setString(2, nombre);
			ps.execute();
			PoolConnection.getPoolConnection().releaseConnection(con);
			

		} catch (SQLException e) {
			System.out.println("error en insert cliente");
		}
		
	}
	public void insertarTarjeta (String dni, int numero, int limite){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		try {
			String senten = "insert into zzpracPrevioCliyTar.dbo.tarjetas values (?,?) insert into zzpracPrevioCliyTar.dbo.tarxcli values(?,?)";
			PreparedStatement ps = con.prepareStatement(senten);
			ps.setInt(3,numero);
			ps.setString(4,dni);
			ps.setInt(1, numero);
			ps.setInt(2, limite);
			ps.execute();
			
		} 
		catch (Exception e) {
			System.out.println("Error en insert tarjeta");
		}
		
	}

	public int sumarLim(String dni) {
		Connection con = PoolConnection.getPoolConnection().getConnection();
		try {
			String senten = "select sum(limite) from zzpracPrevioCliyTar.dbo.tarxcli t inner join zzpracPrevioCliyTar.dbo.tarjetas ta on t.numero = ta.numero where t.dni like ?";
			PreparedStatement ps = con.prepareStatement(senten);
			ps.setString(1, dni);
			ResultSet rs = ps.executeQuery();
			int i=0;
			while (rs.next()){
				i=rs.getInt(1);
			}
			return i;	

		} 
		catch (Exception e) {
			System.out.println("Error en sumar limites");
			return 0;
		}
	}
	
}
